Odomknite silu GraphQL federácie pomocou Schema Stitching. Naučte sa, ako vytvoriť zjednotené GraphQL API z viacerých služieb, čím zlepšíte škálovateľnosť a udržiavateľnosť.
GraphQL federácia: Schema Stitching - Komplexný sprievodca
V neustále sa vyvíjajúcom prostredí moderného vývoja aplikácií sa stala prvoradou potreba škálovateľných a udržiavateľných architektúr. Mikroslužby, s ich vrodenou modularitou a nezávislou nasaditeľnosťou, sa stali populárnym riešením. Správa mnohých mikroslužieb však môže priniesť komplikácie, najmä pokiaľ ide o poskytovanie zjednoteného API pre klientske aplikácie. Práve tu prichádza na scénu GraphQL federácia, a konkrétne Schema Stitching.
Čo je GraphQL federácia?
GraphQL federácia je výkonná architektúra, ktorá vám umožňuje vytvoriť jedno, zjednotené GraphQL API z viacerých podkladových GraphQL služieb (často reprezentujúcich mikroslužby). Umožňuje vývojárom dopytovať dáta naprieč rôznymi službami, akoby išlo o jeden graf, čím sa zjednodušuje klientska skúsenosť a znižuje sa potreba zložitej orchestrácie na strane klienta.
Existujú dva hlavné prístupy k GraphQL federácii:
- Schema Stitching: Tento prístup zahŕňa spájanie viacerých GraphQL schém do jednej, zjednotenej schémy na úrovni brány (gateway). Je to starší prístup a spolieha sa na knižnice, ktoré spravujú kombináciu schém a delegovanie dopytov.
- Apollo federácia: Toto je novší a robustnejší prístup, ktorý využíva deklaratívny jazyk schém a špecializovaný plánovač dopytov na správu procesu federácie. Ponúka pokročilé funkcie ako rozšírenia typov, kľúčové direktívy a distribuované sledovanie (tracing).
Tento článok sa zameriava na Schema Stitching, skúma jeho koncepty, výhody, obmedzenia a praktickú implementáciu.
Pochopenie Schema Stitching
Schema Stitching je proces spájania viacerých GraphQL schém do jednej, súdržnej schémy. Táto zjednotená schéma funguje ako fasáda, ktorá pred klientom skrýva zložitosť podkladových služieb. Keď klient pošle požiadavku na spojenú schému, brána inteligentne presmeruje požiadavku na príslušnú podkladovú službu (alebo služby), získa dáta a skombinuje výsledky pred ich vrátením klientovi.
Predstavte si to takto: Máte viacero reštaurácií (služieb), z ktorých každá sa špecializuje na inú kuchyňu. Schema Stitching je ako univerzálne menu, ktoré kombinuje všetky jedlá z každej reštaurácie. Keď si zákazník (klient) objedná z univerzálneho menu, objednávka je inteligentne presmerovaná do príslušných kuchýň reštaurácií, jedlo sa pripraví a potom sa skombinuje do jednej dodávky pre zákazníka.
Kľúčové koncepty v Schema Stitching
- Vzdialené schémy (Remote Schemas): Sú to individuálne GraphQL schémy každej podkladovej služby. Každá služba vystavuje svoju vlastnú schému, ktorá definuje dáta a operácie, ktoré poskytuje.
- Brána (Gateway): Brána je centrálny komponent zodpovedný za spájanie vzdialených schém a vystavovanie zjednotenej schémy klientovi. Prijíma klientske požiadavky, smeruje ich na príslušné služby a kombinuje výsledky.
- Spájanie schém (Schema Merging): Toto je proces kombinovania vzdialených schém do jednej schémy. Často to zahŕňa premenovanie typov a polí, aby sa predišlo konfliktom, a definovanie vzťahov medzi typmi naprieč rôznymi schémami.
- Delegovanie dopytov (Query Delegation): Keď klient pošle požiadavku na spojenú schému, brána musí delegovať požiadavku na príslušnú podkladovú službu (služby), aby získala dáta. To zahŕňa preklad dopytu klienta na dopyt, ktorému rozumie vzdialená služba.
- Agregácia výsledkov (Result Aggregation): Potom, čo brána získa dáta z podkladových služieb, musí skombinovať výsledky do jednej odpovede, ktorá sa vráti klientovi. To často zahŕňa transformáciu dát, aby zodpovedali štruktúre spojenej schémy.
Výhody Schema Stitching
Schema Stitching ponúka niekoľko presvedčivých výhod pre organizácie, ktoré prijímajú architektúru mikroslužieb:
- Zjednotené API: Poskytuje jedno, konzistentné API pre klientov, zjednodušuje prístup k dátam a znižuje potrebu klientov priamo komunikovať s viacerými službami. Výsledkom je čistejší a intuitívnejší zážitok pre vývojárov.
- Znížená zložitosť na strane klienta: Klienti potrebujú komunikovať iba so zjednotenou schémou, čo ich chráni pred zložitosťou podkladovej architektúry mikroslužieb. To zjednodušuje vývoj na strane klienta a znižuje množstvo kódu potrebného na strane klienta.
- Zvýšená škálovateľnosť: Umožňuje vám škálovať jednotlivé služby nezávisle na základe ich špecifických potrieb. Tým sa zlepšuje celková škálovateľnosť a odolnosť systému. Napríklad služba pre používateľov, ktorá zažíva vysokú záťaž, môže byť škálovaná bez ovplyvnenia iných služieb, ako je katalóg produktov.
- Zlepšená udržiavateľnosť: Podporuje modularitu a oddelenie zodpovedností (separation of concerns), čo uľahčuje údržbu a vývoj jednotlivých služieb. Zmeny v jednej službe majú menšiu pravdepodobnosť, že ovplyvnia iné služby.
- Postupná adopcia: Dá sa implementovať postupne, čo vám umožňuje postupne migrovať z monolitickej architektúry na architektúru mikroslužieb. Môžete začať spájaním existujúcich API a potom postupne rozkladať monolit na menšie služby.
Obmedzenia Schema Stitching
Hoci Schema Stitching ponúka početné výhody, je dôležité si uvedomiť aj jeho obmedzenia:
- Zložitosť: Implementácia a správa spájania schém môže byť zložitá, najmä vo veľkých a komplexných systémoch. Nevyhnutné je starostlivé plánovanie a návrh.
- Výkonnostná réžia: Brána pridáva určitú výkonnostnú réžiu kvôli ďalšej vrstve nepriameho prístupu a potrebe delegovať dopyty a agregovať výsledky. Starostlivá optimalizácia je kľúčová na minimalizáciu tejto réžie.
- Konflikty v schémach: Pri spájaní schém z rôznych služieb môžu vznikať konflikty, najmä ak používajú rovnaké názvy typov alebo polí. To si vyžaduje starostlivý návrh schémy a potenciálne premenovanie typov a polí.
- Obmedzené pokročilé funkcie: V porovnaní s Apollo federáciou chýbajú Schema Stitching niektoré pokročilé funkcie, ako sú rozšírenia typov a kľúčové direktívy, čo môže sťažiť správu vzťahov medzi typmi naprieč rôznymi schémami.
- Zrelosť nástrojov: Nástroje a ekosystém okolo Schema Stitching nie sú tak zrelé ako tie okolo Apollo federácie. To môže sťažiť ladenie a riešenie problémov.
Praktická implementácia Schema Stitching
Prejdime si zjednodušený príklad, ako implementovať Schema Stitching pomocou Node.js a knižnice graphql-tools
(populárna voľba pre spájanie schém). Tento príklad zahŕňa dve mikroslužby: službu pre používateľov (User Service) a službu pre produkty (Product Service).
1. Definujte vzdialené schémy
Najprv definujte GraphQL schémy pre každú zo vzdialených služieb.
Služba pre používateľov (user-service.js
):
const { buildSchema } = require('graphql');
const userSchema = buildSchema(`
type User {
id: ID!
name: String
email: String
}
type Query {
user(id: ID!): User
}
`);
const users = [
{ id: '1', name: 'Alice Smith', email: 'alice@example.com' },
{ id: '2', name: 'Bob Johnson', email: 'bob@example.com' },
];
const userRoot = {
user: (args) => users.find(user => user.id === args.id),
};
module.exports = {
schema: userSchema,
rootValue: userRoot,
};
Služba pre produkty (product-service.js
):
const { buildSchema } = require('graphql');
const productSchema = buildSchema(`
type Product {
id: ID!
name: String
price: Float
userId: ID! # Cudzí kľúč k User Service
}
type Query {
product(id: ID!): Product
}
`);
const products = [
{ id: '101', name: 'Laptop', price: 1200, userId: '1' },
{ id: '102', name: 'Smartphone', price: 800, userId: '2' },
];
const productRoot = {
product: (args) => products.find(product => product.id === args.id),
};
module.exports = {
schema: productSchema,
rootValue: productRoot,
};
2. Vytvorte službu brány (Gateway)
Teraz vytvorte službu brány, ktorá spojí obe schémy dohromady.
Služba brány (gateway.js
):
const { stitchSchemas } = require('@graphql-tools/stitch');
const { makeRemoteExecutableSchema } = require('@graphql-tools/wrap');
const { graphqlHTTP } = require('express-graphql');
const express = require('express');
const { introspectSchema } = require('@graphql-tools/wrap');
const { printSchema } = require('graphql');
const fetch = require('node-fetch');
async function createRemoteSchema(uri) {
const fetcher = async (params) => {
const response = await fetch(uri, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(params),
});
return response.json();
};
const schema = await introspectSchema(fetcher);
return makeRemoteExecutableSchema({
schema,
fetcher,
});
}
async function main() {
const userSchema = await createRemoteSchema('http://localhost:4001/graphql');
const productSchema = await createRemoteSchema('http://localhost:4002/graphql');
const stitchedSchema = stitchSchemas({
subschemas: [
{ schema: userSchema },
{ schema: productSchema },
],
typeDefs: `
extend type Product {
user: User
}
`,
resolvers: {
Product: {
user: {
selectionSet: `{ userId }`,
resolve(product, args, context, info) {
return info.mergeInfo.delegateToSchema({
schema: userSchema,
operation: 'query',
fieldName: 'user',
args: {
id: product.userId,
},
context,
info,
});
},
},
},
},
});
const app = express();
app.use('/graphql', graphqlHTTP({
schema: stitchedSchema,
graphiql: true,
}));
app.listen(4000, () => console.log('Server brány beží na http://localhost:4000/graphql'));
}
main().catch(console.error);
3. Spustite služby
Budete musieť spustiť službu pre používateľov a službu pre produkty na rôznych portoch. Napríklad:
Služba pre používateľov (port 4001):
const express = require('express');
const { graphqlHTTP } = require('express-graphql');
const { schema, rootValue } = require('./user-service');
const app = express();
app.use('/graphql', graphqlHTTP({
schema: schema,
rootValue: rootValue,
graphiql: true,
}));
app.listen(4001, () => console.log('Služba pre používateľov beží na http://localhost:4001/graphql'));
Služba pre produkty (port 4002):
const express = require('express');
const { graphqlHTTP } = require('express-graphql');
const { schema, rootValue } = require('./product-service');
const app = express();
app.use('/graphql', graphqlHTTP({
schema: schema,
rootValue: rootValue,
graphiql: true,
}));
app.listen(4002, () => console.log('Služba pre produkty beží na http://localhost:4002/graphql'));
4. Dopytujte spojenú schému
Teraz môžete dopytovať spojenú schému cez bránu (bežiacu na porte 4000). Môžete spustiť dopyt ako tento:
query {
product(id: "101") {
id
name
price
user {
id
name
email
}
}
}
Tento dopyt získa produkt s ID "101" a tiež načíta priradeného používateľa zo služby pre používateľov, čo demonštruje, ako Schema Stitching umožňuje dopytovať dáta naprieč viacerými službami v jedinej požiadavke.
Pokročilé techniky Schema Stitching
Okrem základného príkladu, tu sú niektoré pokročilé techniky, ktoré možno použiť na vylepšenie vašej implementácie Schema Stitching:
- Delegovanie schémy: Toto umožňuje delegovať časti dopytu rôznym službám na základe požadovaných dát. Napríklad môžete delegovať rozlíšenie typu `User` na službu pre používateľov a rozlíšenie typu `Product` na službu pre produkty.
- Transformácia schémy: Zahŕňa úpravu schémy vzdialenej služby predtým, ako je spojená do zjednotenej schémy. To môže byť užitočné na premenovanie typov a polí, pridávanie nových polí alebo odstraňovanie existujúcich polí.
- Vlastné resolvery: Môžete definovať vlastné resolvery v bráne na spracovanie zložitých transformácií dát alebo na získavanie dát z viacerých služieb a ich kombinovanie do jedného výsledku.
- Zdieľanie kontextu: Často je potrebné zdieľať kontextové informácie medzi bránou a vzdialenými službami, ako sú autentifikačné tokeny alebo ID používateľov. To sa dá dosiahnuť odovzdaním kontextových informácií ako súčasti procesu delegovania dopytu.
- Spracovanie chýb: Implementujte robustné spracovanie chýb na elegantné zvládanie chýb, ktoré sa vyskytnú vo vzdialených službách. To môže zahŕňať zaznamenávanie chýb, vracanie používateľsky prívetivých chybových hlásení alebo opakovanie neúspešných požiadaviek.
Voľba medzi Schema Stitching a Apollo federáciou
Hoci je Schema Stitching životaschopnou možnosťou pre GraphQL federáciu, Apollo federácia sa stala populárnejšou voľbou vďaka svojim pokročilým funkciám a zlepšenej vývojárskej skúsenosti. Tu je porovnanie oboch prístupov:
Funkcia | Schema Stitching | Apollo federácia |
---|---|---|
Definícia schémy | Používa existujúci jazyk GraphQL schém | Používa deklaratívny jazyk schém s direktívami |
Plánovanie dopytov | Vyžaduje manuálne delegovanie dopytov | Automatické plánovanie dopytov pomocou Apollo Gateway |
Rozšírenia typov | Obmedzená podpora | Zabudovaná podpora pre rozšírenia typov |
Kľúčové direktívy | Nepodporované | Používa direktívu @key na identifikáciu entít |
Distribuované sledovanie | Vyžaduje manuálnu implementáciu | Zabudovaná podpora pre distribuované sledovanie |
Nástroje a ekosystém | Menej zrelé nástroje | Zrelšie nástroje a veľká komunita |
Zložitosť | Môže byť zložité na správu vo veľkých systémoch | Navrhnuté pre veľké a zložité systémy |
Kedy zvoliť Schema Stitching:
- Máte existujúce GraphQL služby a chcete ich rýchlo spojiť.
- Potrebujete jednoduché riešenie federácie a nevyžadujete pokročilé funkcie.
- Máte obmedzené zdroje a chcete sa vyhnúť réžii spojenej s nastavením Apollo federácie.
Kedy zvoliť Apollo federáciu:
- Budujete veľký a zložitý systém s viacerými tímami a službami.
- Potrebujete pokročilé funkcie ako rozšírenia typov, kľúčové direktívy a distribuované sledovanie.
- Chcete robustnejšie a škálovateľnejšie riešenie federácie.
- Uprednostňujete deklaratívnejší a automatizovanejší prístup k federácii.
Príklady z reálneho sveta a prípady použitia
Tu sú niektoré príklady z reálneho sveta, ako sa dá GraphQL federácia, vrátane Schema Stitching, použiť:
- E-commerce platforma: E-commerce platforma môže použiť GraphQL federáciu na kombinovanie dát z viacerých služieb, ako sú služba katalógu produktov, služba používateľov, služba objednávok a platobná služba. To umožňuje klientom ľahko získať všetky informácie potrebné na zobrazenie detailov produktov, profilov používateľov, histórie objednávok a platobných informácií.
- Platforma sociálnych médií: Platforma sociálnych médií by mohla použiť GraphQL federáciu na kombinovanie dát zo služieb, ktoré spravujú profily používateľov, príspevky, komentáre a lajky. To umožňuje klientom efektívne načítať všetky informácie potrebné na zobrazenie profilu používateľa, jeho príspevkov a komentárov a lajkov spojených s týmito príspevkami.
- Aplikácia pre finančné služby: Aplikácia pre finančné služby môže použiť GraphQL federáciu na kombinovanie dát zo služieb, ktoré spravujú účty, transakcie a investície. To umožňuje klientom ľahko získať všetky informácie potrebné na zobrazenie zostatkov na účtoch, histórie transakcií a investičných portfólií.
- Systém na správu obsahu (CMS): CMS môže využiť GraphQL federáciu na integráciu dát z rôznych zdrojov, ako sú články, obrázky, videá a obsah generovaný používateľmi. To umožňuje zjednotené API na načítanie všetkého obsahu súvisiaceho s konkrétnou témou alebo autorom.
- Aplikácia v zdravotníctve: Integrujte dáta pacientov z rôznych systémov, ako sú elektronické zdravotné záznamy (EHR), výsledky laboratórnych testov a plánovanie termínov. To ponúka lekárom jediný prístupový bod ku komplexným informáciám o pacientovi.
Osvedčené postupy pre Schema Stitching
Aby ste zaistili úspešnú implementáciu Schema Stitching, dodržiavajte tieto osvedčené postupy:
- Starostlivo si naplánujte schému: Predtým, ako začnete spájať schémy, starostlivo si naplánujte štruktúru zjednotenej schémy. To zahŕňa definovanie vzťahov medzi typmi naprieč rôznymi schémami, premenovanie typov a polí, aby sa predišlo konfliktom, a zváženie celkových vzorcov prístupu k dátam.
- Používajte konzistentné konvencie pomenovania: Prijmite konzistentné konvencie pomenovania pre typy, polia a operácie vo všetkých službách. Pomôže to predchádzať konfliktom a uľahčí pochopenie zjednotenej schémy.
- Dokumentujte svoju schému: Dôkladne dokumentujte zjednotenú schému vrátane popisov typov, polí a operácií. Uľahčí to vývojárom pochopenie a používanie schémy.
- Monitorujte výkon: Monitorujte výkon brány a vzdialených služieb, aby ste identifikovali a riešili akékoľvek výkonnostné úzke miesta. Používajte nástroje ako distribuované sledovanie na sledovanie požiadaviek naprieč viacerými službami.
- Implementujte bezpečnosť: Implementujte príslušné bezpečnostné opatrenia na ochranu brány a vzdialených služieb pred neoprávneným prístupom. To môže zahŕňať použitie autentifikačných a autorizačných mechanizmov, ako aj validáciu vstupu a kódovanie výstupu.
- Verziujte svoju schému: Pri vývoji svojich schém ich primerane verziujte, aby klienti mohli naďalej používať staršie verzie schémy bez toho, aby sa niečo pokazilo. Pomôže to predchádzať zmenám, ktoré by mohli spôsobiť nefunkčnosť (breaking changes), a zaistiť spätnú kompatibilitu.
- Automatizujte nasadenie: Automatizujte nasadenie brány a vzdialených služieb, aby sa zmeny mohli nasadzovať rýchlo a spoľahlivo. Pomôže to znížiť riziko chýb a zlepšiť celkovú agilitu systému.
Záver
GraphQL federácia so Schema Stitching ponúka výkonný prístup k budovaniu zjednotených API z viacerých služieb v architektúre mikroslužieb. Porozumením jej základných konceptov, výhod, obmedzení a implementačných techník môžete využiť Schema Stitching na zjednodušenie prístupu k dátam, zlepšenie škálovateľnosti a zvýšenie udržiavateľnosti. Hoci sa Apollo federácia stala pokročilejším riešením, Schema Stitching zostáva životaschopnou možnosťou pre jednoduchšie scenáre alebo pri integrácii existujúcich GraphQL služieb. Starostlivo zvážte svoje špecifické potreby a požiadavky, aby ste si vybrali najlepší prístup pre vašu organizáciu.